package com.clei.netty.file.enums;

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 文件上传相关命令类型枚举
 *
 * @author Y
 * @date 2022-04-21
 */
public enum FileCmdTypeEnum {

    /**
     * 设置文件存储路径 配置
     */
    CONF_FILE_DIRECTORY("设置文件存储路径", (byte) 0),
    /**
     * 上传文件 请求
     */
    REQ_UPLOAD("请求上传文件", (byte) 1),
    /**
     * 查看文件目录 请求
     */
    REQ_CATEGORY("请求查看文件目录", (byte) 2),
    /**
     * 下载文件 请求
     */
    REQ_DOWNLOAD("请求下载文件", (byte) 3),
    /**
     * 上传截屏 请求
     */
    REQ_CAPTURE_SCREEN("请求上传截屏", (byte) 4),
    /**
     * 执行命令 请求
     */
    REQ_CMD("请求执行命令", (byte) 5),
    /**
     * 帮助信息
     */
    HELP("帮助信息", (byte) 10),
    /**
     * 上传文件 响应 确认
     */
    RES_UPLOAD_ACK("上传文件确认", (byte) 11),
    /**
     * 上传文件 响应 拒绝
     */
    RES_UPLOAD_REFUSE("上传文件拒绝", (byte) 12),
    /**
     * 上传文件 数据
     */
    REQ_UPLOAD_DATA("上传文件数据", (byte) 13),
    /**
     * 上传文件 成功
     */
    RES_UPLOAD_SUCCESS("上传文件成功", (byte) 14),
    /**
     * 上传文件 失败
     */
    RES_UPLOAD_FAIL("上传文件失败", (byte) 15),
    /**
     * 文件目录
     */
    RES_CATEGORY("文件目录", (byte) 21),
    /**
     * 下载文件 响应 拒绝
     */
    RES_DOWNLOAD_REFUSE("下载文件拒绝", (byte) 31),
    /**
     * 下载文件 响应 数据
     */
    RES_DOWNLOAD_DATA("下载文件数据", (byte) 32),
    /**
     * 上传截屏 响应
     */
    RES_CAPTURE_SCREEN_ACK("上传截屏确认", (byte) 41),
    /**
     * 执行命令 响应
     */
    RES_CMD_ACK("执行命令确认", (byte) 51);

    /**
     * cmdCode -> CmdTypeEnum map
     */
    private static final Map<Byte, FileCmdTypeEnum> CODE_MAP = Arrays.stream(FileCmdTypeEnum.values())
            .collect(Collectors.toMap(FileCmdTypeEnum::getCmdCode, e -> e));

    /**
     * name -> CmdTypeEnum map
     */
    private static final Map<String, FileCmdTypeEnum> NAME_MAP = Arrays.stream(FileCmdTypeEnum.values())
            .collect(Collectors.toMap(FileCmdTypeEnum::name, e -> e));

    /**
     * 命令名称
     */
    private final String cmdName;

    /**
     * 命令编码
     */
    private final Byte cmdCode;

    FileCmdTypeEnum(String cmdName, Byte cmdCode) {
        this.cmdName = cmdName;
        this.cmdCode = cmdCode;
    }

    /**
     * 根据cmdCode获取枚举
     *
     * @param cmdCode 命令编码
     * @return CmdTypeEnum
     */
    public static FileCmdTypeEnum getByCmdCode(Byte cmdCode) {
        return null == cmdCode ? null : CODE_MAP.get(cmdCode);
    }

    /**
     * 根据name获取枚举
     *
     * @param name 枚举名称
     * @return CmdTypeEnum
     */
    public static FileCmdTypeEnum getByName(String name) {
        return null == name ? null : NAME_MAP.get(name);
    }

    public Byte getCmdCode() {
        return cmdCode;
    }

    public String getCmdName() {
        return cmdName;
    }
}

